EC2 インスタンスメタデータの中身をちゃんと確認してみた
この記事は アノテーション株式会社 AWS Technical Support Advent Calendar 2023 | Advent Calendar 2023 - Qiita 12日目の記事です。
概要
EC2 でインスタンスメタデータ取得を行うとどの様なデータが取得できるかを改めて確認しました。
メタデータを取得するシチュエーションや、 AWS CLI コマンドの describe-instances
との違いも一緒に見ていきたいと思います。
基本のインスタンスメタデータ取得
インスタンスメタデータを取得することで、実行中のインスタンスの情報 (インスタンス ID や、AMI ID、 IP アドレス、ホスト名等) を確認することができます。
インスタンスから curl や wget を実行することで情報が取得できます。
curl -s http://169.254.169.254/latest/meta-data/
Windows の場合は、Powershell で下記を実行することで情報が取得できます。
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/
インスタンスメタデータの中身
インスタンスメタデータは下記の様な階層にデータが格納されています。
$ curl -s http://169.254.169.254/latest/meta-data/ ami-id ami-launch-index ami-manifest-path block-device-mapping/ events/ hostname iam/ identity-credentials/ instance-action instance-id instance-life-cycle instance-type local-hostname local-ipv4 mac managed-ssh-keys/ metrics/ network/ placement/ profile public-hostname public-ipv4 public-keys/ reservation-id security-groups services/
試しにいくつかのメタデータを取得してみます。
$ curl -s http://169.254.169.254/latest/meta-data/hostname ip-192-168-1-218.ap-northeast-1.compute.internal $ curl -s http://169.254.169.254/latest/meta-data/local-ipv4 192.168.1.218 $ curl -s http://169.254.169.254/latest/meta-data/placement/region ap-northeast-1 $ curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone ap-northeast-1a $ curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/ TEST_EC2_role
インスタンスメタデータで取得できる情報の詳細は、下記の AWS ドキュメントに記載があります。
インスタンスメタデータのカテゴリ - Amazon Elastic Compute Cloud
インスタンスメタデータ ユーザデータや動的データ
インスタンスメタデータでは、対象インスタンスのユーザデータや動的データを取得する方法もあります。
http://169.254.169.254/latest/
の中身を見てみると、下記の構成になっています。
$ curl -s http://169.254.169.254/latest/ dynamic meta-data user-data
user-data
では、対象インスタンスのユーザデータを確認することができます。
dynamic
では、動的データ (インスタンスが停止して起動、再起動、起動するときに生成される情報) を纏めて取得することができます。
$ curl -s http://169.254.169.254/latest/dynamic/instance-identity/document { "accountId" : "123456789012", "architecture" : "x86_64", "availabilityZone" : "ap-northeast-1a", "billingProducts" : null, "devpayProductCodes" : null, "marketplaceProductCodes" : null, "imageId" : "ami-XXXXXXXXXXX", "instanceId" : "i-XXXXXXXXXXX", "instanceType" : "t3.micro", "kernelId" : null, "pendingTime" : "2023-12-11T04:57:22Z", "privateIp" : "192.168.1.218", "ramdiskId" : null, "region" : "ap-northeast-1", "version" : "2017-09-30" } $
http://169.254.169.254/latest/meta-data/
を利用することがほとんどだと思いますが、ユーザデータ等の情報を確認する方法も用意されていました。便利ですね。
インスタンスメタデータでしか取得できない情報、利用用途
インスタンスメタデータを取得することで、インスタンスの様々な情報が簡単に取得できることが分かりました。
AWS CLI を利用できないシチュエーションやインターネット接続環境が無い場合にも、確実にインスタンスの情報を取得することが可能です。
ここまでインスタンスメタデータで取得できる情報を見てきましたが、取得できる情報のほとんどは AWS CLI コマンドの describe-instances
で代用できるように見えます。
ですが、実際に見比べてみると、取得できる情報には違いがありました。
運用で利用できそうな情報としては、インスタンスのメンテナンス情報が記録されている events/maintenance/history
events/maintenance/scheduled
などです。
メンテナンスイベントは、インスタンスを利用する上で必ず PHD (Personal Health Dashboard) やメール通知を確認して対応していく必要があります。
インスタンスメタデータで確認することで、対象インスタンスのメンテナンスイベント履歴一覧を確認したい場合等に役立ちそうです。
その他にも、あらゆるトラブルシューティングで必要な情報を取得できるようにインスタンスメタデータは用意されている様でした。
インスタンスメタデータでしか取得できない情報は、下記表の通りです。
カテゴリ | 説明 |
---|---|
ami-manifest-path | Amazon S3 での AMI のマニフェストファイルのパス。Amazon EBS-backed AMI を使用してインスタンスを起動した場合、返される結果は unknown です。 |
ancestor-ami-ids | この AMI を作成するために再バンドルされたあらゆるインスタンスの AMI ID。この値は、AMI マニフェストファイルが ancestor-amis キーを含む場合にのみ存在します。 |
autoscaling/target-lifecycle-state | Auto Scaling インスタンスの移行先となる、ターゲットの Auto Scaling ライフサイクルの状態を示す値。2022 年 3 月 10 日以降、インスタンスがターゲットのライフサイクル状態の 1 つに移行したときに表示されます。 |
block-device-mapping/ephemeralN | 非 NVMe インスタンスストアボリュームの仮想デバイス。N は、各ボリュームのインデックスを示します。ブロックデバイスマッピングのインスタンスストアボリュームの数は、インスタンスのインスタンスストアボリュームの実際の数に一致しない場合があります。 |
block-device-mapping/swap | swap に関連付けられた仮想デバイス。存在しない場合もあります。 |
events/maintenance/history | インスタンスの完了またはキャンセルされたメンテナンスイベントがある場合は、イベントに関する情報を含む JSON 文字列を含みます。詳細については、「完了またはキャンセルされたイベントのイベント履歴を表示するには」を参照してください。 |
events/maintenance/scheduled | インスタンスがアクティブなメンテナンスイベントがある場合は、イベントに関する情報を含む JSON 文字列を含みます。詳細については、予定されたイベントの表示 を参照してください。 |
events/recommendations/rebalance | EC2 インスタンスの再調整推奨通知がインスタンスに対して送信されるおおよその時間 (UTC)。このカテゴリのメタデータの例を次に示します。 |
identity-credentials/ec2/info | identity-credentials/ec2/security-credentials/ec2-instance の認証情報に関する情報。 |
identity-credentials/ec2/security-credentials/ec2-instance | インスタンス上のソフトウェアが自身を AWS に識別し、EC2 Instance Connect や AWS Systems Manager デフォルトのホスト管理設定などの機能をサポートできるようにするインスタンスアイデンティティロール用の認証情報。 |
instance-action | バンドルの準備のために再起動する必要があることをインスタンスに伝えます。有効な値: none, shutdown, bundle-pending。 |
network/interfaces/macs/mac/network-card-index | ネットワークカードのインデックス。インスタンスタイプによっては、複数のネットワークカードがサポートされているものもあります。 |
services/partition | リソースが置かれているパーティションです。標準の AWS リージョンの場合、パーティションは aws です。他のパーティションにリソースがある場合、パーティションは aws-partitionname です。例えば、中国 (北京) リージョンにあるリソースのパーティションは、aws-cn です。 |
最後に
インスタンスメタデータの概要を知るために、メタデータで取得できる情報を改めて調べました。
このブログがどなたかのお役にたてば幸いです。
参考資料
インスタンスメタデータとユーザーデータ - Amazon Elastic Compute Cloud
インスタンスメタデータの取得 - Amazon Elastic Compute Cloud
インスタンスメタデータのカテゴリ - Amazon Elastic Compute Cloud
インスタンスアイデンティティドキュメント - Amazon Elastic Compute Cloud
describe-instances — AWS CLI 2.0.34 Command Reference
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、さまざまな背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。